home *** CD-ROM | disk | FTP | other *** search
- program assemblerguf;
- {
- Stars #1
- - by Bjarke Visφe
- nov 1993
-
- Really old stuff, this one.
- Tampered on Lyngby EDB-skoles computer... a 16mhz 386! (shiiiit...)
- }
-
- uses
- DEMOINIT;
-
- const
- width = 320;
- stars = 1400;
-
- type
- coord = record
- x,y,z : integer;
- end;
-
- var
- oldmode, oldpage : shortint;
- taller : integer;
- ytabel : array [0..255] of integer;
- sinustabel : array [0..639] of integer;
-
- i, j : integer;
-
- StarXY : array [1..stars] of coord;
- ClearTabel : array [1..stars] of coord;
-
- starpos : integer;
- starcount : integer;
- vinkelx, vinkely, vinkelz : integer;
- vxadd, vyadd, vzadd : integer;
-
-
- (*-----------------------------------------------------------*)
-
-
- procedure setupsinus;
- var
- i : integer;
- v, vadd : real;
- begin
- v:=0.0;
- vadd:=(2.0*pi/512.0);
- for i:=0 to 639 do
- begin
- sinustabel[i]:=round(sin(v)*32767);
- v:=v+vadd;
- end;
- end;
-
-
- procedure SetupCoords;
- var
- i : integer;
- begin
- for i:=1 to stars do with ClearTabel[i] do begin
- x:=0; y:=0; z:=0;
- end;
-
- randomize;
- for i:=1 to stars do
- with starXY[i] do begin
- x := random(65535)-$8000;
- y := random(65535)-$8000;
- z := random(512);
- end;
- end;
-
-
- procedure SetupDemo;
- var
- i : integer;
- begin
- vinkelx:=0; vinkely:=0; vinkelz:=0;
- SetupSinus;
- SetupCoords;
-
- for i:=0 to 255 do ytabel[i]:=i*width;
- end;
-
-
- (*-----------------------------------------------------------*)
-
- procedure OpenScreen;
- var
- i, color : integer;
- begin
- asm
- mov ah,$0F
- int $10
- mov oldmode,al
-
- mov al,$13
- xor ah,ah
- int $10
- end;
-
- color := 64;
- for i:=0 to 63 do
- begin
- SetRGB(i, color,color,color);
- dec(color);
- end;
- end;
-
- procedure CloseScreen;
- begin
- asm
- mov al,oldmode
- xor ah,ah
- int $10
- end;
- end;
-
-
- (*-----------------------------------------------------------*)
-
- procedure SetVinkel;
- begin
- vinkelx:=(vinkelx+1) mod 512;
- vinkely:=(vinkely+1) mod 512;
- vinkelz:=(vinkelz+2) mod 512;
-
- vxadd:=sinustabel[vinkelx]*3;
- vyadd:=sinustabel[vinkely]*3;
- vzadd:=sinustabel[vinkelz] DIV 180;
- end;
-
-
- procedure ClearStars;
- begin
- asm
- mov ax,SEGA000
- mov es,ax
- lea si,ClearTabel {point at record array}
- mov ax,6 {record size}
- xor dl,dl
- mov cx,stars
- @ClearLoop:
- mov bx,[si]
- mov [es:bx],dl
- add si,ax
- loop @ClearLoop
- end;
- end;
-
-
- procedure PlotStars;
- begin
- starcount := stars;
- starpos := 0;
-
- asm
- mov ax,SEGA000
- mov es,ax
- @starloop:
- lea si,starXY
- add si,starpos
- mov bx,[si]
- mov ax,[si+2]
- mov cx,[si+4]
- add bx,vxadd
- add ax,vyadd
- add cx,vzadd
- and cx,511
- inc cx
-
- cwd
- idiv cx
- xchg bx,ax
- cwd
- idiv cx
- add ax,160
- cmp ax,319
- ja @StarLoopAgain
- add bx,100
- cmp bx,199
- ja @StarLoopAgain
-
- shl bx,1
- add bx,OFFSET ytabel
- mov bx,[bx]
- add bx,ax
- lea si,ClearTabel
- add si,starpos
- mov [si],bx
-
- shr cx,3
- and cl,63
- mov [es:bx],cl
- @StarLoopAgain:
- add starpos,6
- dec StarCount
- jnz @StarLoop
- end;
- end;
-
-
- (*-----------------------------------------------------------*)
-
- begin
- SetupDemo;
- OpenScreen;
-
- while (not keypressed) do begin
- VBLANK;
- ClearStars;
- PlotStars;
- SetVinkel;
- end;
-
- CloseScreen;
- end.
-